#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import cv2 as cv

def open_camera(camera_index=0):
    """
    打开指定索引的摄像头

    参数:
        camera_index (int): 摄像头设备索引，默认为0（通常是内置摄像头）
    返回:
        VideoCapture对象或None（如果打开失败）
    """
    cap = cv.VideoCapture(camera_index)
    if not cap.isOpened():
        print(f"无法打开摄像头 (索引: {camera_index})")
        return None
    
    print(f"摄像头已成功打开 (索引: {camera_index})")
    print(f"分辨率: {int(cap.get(cv.CAP_PROP_FRAME_WIDTH))}x{int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))}")
    print(f"帧率: {cap.get(cv.CAP_PROP_FPS):.2f} FPS")
    return cap


def process_frame(frame):
    """
    处理视频帧
    
    参数:
        frame: 从摄像头捕获的原始帧
    返回:
        处理后的帧
    """
    # 将彩色图像转换为灰度图像
    return cv.cvtColor(frame, cv.COLOR_BGR2GRAY)


def capture_video_stream():
    """
    主函数：捕获视频流并显示
    """
    # 打开摄像头
    cap = open_camera()
    if cap is None:
        return
    
    try:
        print("开始捕获视频流。按'q'键退出...")
        while True:
            # 捕获一帧视频
            ret, frame = cap.read()
            
            # 检查帧是否正确读取
            if not ret:
                print("无法接收视频帧（视频流结束？）。退出中...")
                break
            
            # 处理帧
            processed_frame = process_frame(frame)
            
            # 显示处理后的帧
            cv.imshow('视频捕获', processed_frame)
            
            # 等待按键，如果是'q'则退出
            # 等待1毫秒，允许程序处理其他事件
            if cv.waitKey(1) == ord('q'):
                print("用户按下'q'键，退出中...")
                break
    
    finally:
        # 释放资源
        cap.release()
        cv.destroyAllWindows()
        print("已释放所有资源")


if __name__ == "__main__":
    capture_video_stream()